package com.example.hutooldemo.xml;


import cn.hutool.core.util.XmlUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 李建
 * @version 1.0
 * @date 2021/10/20 0020 15:37
 */
public class XmlStateUtil {
    /**
     * 查询element之下所有层级的文本数据
     *
     * @param element 根节点（上级节点）
     * @param name    需要查询的节点名称，不需要加<></>
     * @return
     */
    public static List<String> getElementValueByName(Element element, String name) {
        //从节点里，获取这个 子节点
        NodeList nodeList = element.getElementsByTagName(name);
        List<String> stringList = new ArrayList<>();
        //遍历 放入lists
        for (int i = 0; i < nodeList.getLength(); i++) {
            stringList.add(nodeList.item(i).getTextContent());
        }
        return stringList;
    }

    /**
     * 编译xml字符串，查询所有层级的文本数据
     *
     * @param xmlData xml字符串
     * @param name    需要查询的节点名称，不需要加<></>
     * @return
     */
    public static List<String> getXmlValueByName(String xmlData, String name) {
        //xml 转成 document
        Document document = XmlUtil.parseXml(xmlData);
        //获得XML文档根节点
        Element elementG = XmlUtil.getRootElement(document);
        return getElementValueByName(elementG, name);
    }

    /**
     * 给一个节点下添加一个新的节点并赋值
     *
     * @param document 核心xml主要数据
     * @param element  需要添加节点的节点
     * @param tagName  节点名称
     * @param value    节点文本
     * @return
     */
    public static void setXmlStrByElementAndText(Document document, Element element, String tagName, String value) {
        //在文档下，创建 Element
        Element elementItem = document.createElement(tagName);
        //设置上 内容
        elementItem.setTextContent(value);
        //添加到 对象列表
        element.appendChild(elementItem);
    }

    /**
     * 根据表达式，获取最终目录下的第一个节点
     *
     * @param document 核心xml主数据
     * @param url      表达式 例：//forms/formExport/definitions/column
     * @param number   按顺序第一几个节点，最小为第一个
     * @return
     */
    public static Element getElementByUrl(Document document, String url, int number) {
        //获取到这个 nodeList
        NodeList nodeList = XmlUtil.getNodeListByXPath(url, document);
        //转成 对象list
        List<Element> elementList = XmlUtil.transElements(nodeList);
        //获取 出这个 节点
        return elementList.get(number > 0 ? number : 0);
    }

}
